home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Utilities / Fonts / pcATMfont2Next / unfont.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-12  |  3.9 KB  |  201 lines

  1. /*
  2.  * NOTICE
  3.  *
  4.  * Copyright 1988, 1989 by h-three Systems Corporation.
  5.  *
  6.  * Permission is hereby granted for this software's free reproduction
  7.  * and modification for non-commercial purposes, provided that this
  8.  * notice is retained. Commercial enterprises may give away copies
  9.  * as part of their products provided that they do so without charge,
  10.  * that they retain this notice, and that they acknowledge the source
  11.  * of the software.
  12.  *
  13.  *      PostScript is a registered trademark of Adobe Systems Incorporated.
  14.  *      IBM is a registered trademark of International Business Machines
  15.  *        Corporation.
  16.  *
  17.  *      h-three Systems Corporation
  18.  *      100 Park Drive Suite 204/ P.O. Box 12557
  19.  *      Research Triangle Park, NC  27709
  20.  */
  21.  
  22. /* modified by Bryan Bayerdorffer 4/91.  Simplified code by chopping out
  23.  * sysV-isms. */
  24.  
  25.  
  26.  
  27. /*
  28.  * unfont.c
  29.  *
  30.  * usage: unfont file
  31.  *
  32.  *  or
  33.  *
  34.  *        unfont       reads from stdin
  35.  *
  36.  * Unpacks IBM PC-format PostScript fonts into a downloadable form.
  37.  *
  38.  */
  39.  
  40. #include <stdio.h>
  41. #include <fcntl.h>
  42. #include <ctype.h>
  43.  
  44. #define OK      0
  45. #define FAILURE (-1)
  46. #define Failed(x)       ((x) == FAILURE)
  47. #define TRUE    1
  48. #define FALSE   0
  49. typedef char bool;
  50. #define STREQ(a,b)      (strcmp(a,b) == 0)
  51.  
  52. FILE *fp;
  53.  
  54. /*
  55.  * used to convert nibbles (n0 is least sig) to ascii-hex
  56.  */
  57.  
  58. #define N0(c)       hexbyt[((c) & 0x000f)]
  59. #define N1(c)       N0((c) >> 4)
  60.  
  61. char hexbyt[] = "0123456789ABCDEF";
  62.  
  63. /*
  64.  * vars controlled by command line options
  65.  */
  66.  
  67. char *infile;
  68.  
  69. char *progname;                         /* for error() */
  70.  
  71. char *strchr(), *strrchr();
  72.  
  73. int mygetc();
  74. void dounfont();
  75. long getcount();
  76. void bintohex();
  77.  
  78. main(argc, argv)
  79. int argc;
  80. char **argv;
  81. {
  82.  
  83. /* unfont stuff         */
  84.  
  85.     if (argv[1])
  86.     {
  87.  
  88.             if (!(fp = fopen(argv[1], "r"))) {
  89.                 printf("can't open input file '%s'", argv[1]);
  90.             }
  91.  
  92.             infile = argv[1];
  93.             dounfont();
  94.             fclose(fp);
  95.     }
  96.     else
  97.     {
  98.         infile = "<stdin>";
  99.         fp = stdin;
  100.         dounfont();
  101.     }
  102.     exit(0);
  103. }
  104.  
  105. long getcount();
  106.  
  107. void
  108. dounfont()
  109. {
  110.     register int c;
  111.              long count;
  112.     register int i;
  113.  
  114.     for (;;)
  115.     {
  116.         if ((c = mygetc()) != 0x80) {
  117.                 printf("not a proper font data segment '%s'", infile);
  118.                 printf("foobar char is 0x%x", c);
  119.                 exit(1);
  120.         }
  121.         c = mygetc();
  122.         switch (c) {
  123.         case 1:
  124.                 /* get count, output count bytes to stdout      */
  125.                 count = getcount();
  126.  
  127.                 for (i=0; i<count; i++) {
  128.                         c = mygetc();
  129.                         putchar(c == '\r' ? '\n' : c);
  130.                 }
  131.                 break;
  132.         case 2:
  133.                 /* get count, convert count bytes to hex, output        */
  134.                 /* to stdout                                            */
  135.                 count = getcount();
  136.  
  137.  
  138.                 bintohex(count);
  139.                 break;
  140.         case 3:
  141.                 /* reached EOF; next file, please                       */
  142.  
  143.                 return;
  144.  
  145.         default:
  146.                 printf("not a valid segment type '%s'", infile);
  147.                 return;
  148.         }
  149.     }
  150. }
  151.  
  152. /*
  153.  * getc for error-checking
  154.  */
  155.  
  156. int
  157. mygetc()
  158. {
  159.         int ch;
  160.         if ((ch = getc(fp)) == -1) {
  161.             printf("unexpected eof on input in '%s'", infile);
  162.             exit(1);
  163.         }
  164.         return(ch);
  165. }
  166.  
  167. /*
  168.  * get count of bytes from segment header
  169.  */
  170.  
  171. long
  172. getcount()
  173. {
  174.         int i;
  175.         long count = 0;
  176.  
  177.         for (i=0; i<4; i++)
  178.                 count += ((long) mygetc()) << (i * 8);
  179.         return(count);
  180. }
  181.  
  182. /*
  183.  * convert binary to ASCII hex and write it to stdout
  184.  */
  185.  
  186. void
  187. bintohex(count)
  188. long count;
  189. {
  190.         int ch;
  191.         long i;
  192.  
  193.         for (i=0; i<count; i++) {
  194.                 if ((i % 30) == 0)
  195.                     putchar('\n');
  196.                 ch = mygetc();
  197.                 putchar(N1(ch));
  198.                 putchar(N0(ch));
  199.         }
  200. }
  201.